#include <string>
#include <regex>
#include <iostream>

int main()
{
    std::string httpQeq("GET /havefun/login?usrname=zs&passwd=12345 HTTP/1.0\r\n");
    // std::string httpQeq("GET /havefun/login HTTP/1.0\n");
    std::smatch sm;
    //(GET|POST|HEAD|DELETE|PUT) 匹配并提取其中的任意一个字符串
    //[^?] 匹配除 ? 以外的字符串
    // * 匹配前面的表达式零次或多次
    // \\? 原始的?字符
    // 点 . 匹配除 \n 和 \r 以外的任何单个字符
    // \\. 原始的.字符
    // [01] 匹配 0 或 1
    // (?: ...) ?:不提取()中的内容
    // ? 匹配前面表达式0次或1次
    std::regex reg("(GET|POST|HEAD|DELETE|PUT) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    bool ret = std::regex_match(httpQeq, sm, reg);
    if (!ret) { std::cout << "match err" << std::endl; return -1; }
    // for (const auto& s : sm) {
    //     std::cout << s << std::endl;
    // }
    for (int i = 0; i < sm.size(); ++i) {
        std::cout << i << ":" << sm[i] << std::endl;
    }
    return 0;
}